// // 读取文件内容并打印
// // 编写一个 Node.js 脚本，读取一个文本文件（example.txt）的内容，并将其打印到控制台。要求使用异步和同步两种方式实现。
// // 提示：使用 fs.readFile() 和 fs.readFileSync()。
let fs = await import("fs"); //导入fs
import path from "path"; //导入path
/*
// //异步读取
// fs.readFile("example.txt", "utf8", (err, data) => {
//   if (err) {
//     console.log(err);
//   } else {
//     console.log("异步读取文件内容:", data);
//   }
// });
// //同步读取
// let res = fs.readFileSync("example.txt", "utf8");
// console.log("同步读取文件内容:", res);
*/

// // 写入文件内容
// // 编写一个 Node.js 脚本，将一段文本内容写入到一个文件（output.txt）中。如果文件已存在，则覆盖原有内容；如果文件不存在，则创建文件。
// // 提示：使用 fs.writeFile() 或 fs.writeFileSync()。
/*
//异步写入内容
fs.writeFile("output.txt", "我也是txt文件", (err) => {
  if (err) {
    console.log("创建失败");
  } else {
    console.log("成功创建output.txt文件");
  }
});
//同步写入内容
fs.writeFileSync("output.txt", "hhh");
*/

// // 追加内容到文件
// // 编写一个 Node.js 脚本，将一段文本内容追加到一个文件（example.txt）的末尾。如果文件不存在，则自动创建文件。
// // 提示：使用 fs.appendFile() 或 fs.appendFileSync()。
// //异步追加文本内容
// fs.appendFile("example.txt", "\n我是异步追加的内容", (err) => {
//   console.log(err ? "追加失败" : "追加成功");
// });
// //同步追加文本内容
//fs.appendFileSync("example.txt", "\n\n我是同步追加的内容");

// // 进阶练习题
// // 创建和删除文件
// // 编写一个 Node.js 脚本，完成以下任务：
// // 创建一个名为 test.txt 的文件，并写入内容 "Hello, Node.js!"。
// fs.writeFileSync("test.txt", "Hello, Node.js!");

// 检查文件是否存在，如果存在，则删除该文件。
// 提示：使用 fs.writeFile()、fs.existsSync() 和 fs.unlink()。
/*
if (fs.existsSync("./test.txt")) {
  console.log("文件存在");
  fs.unlink("./test.txt", (err) => {
    console.log(err ? "删除失败" : "删除成功");
  });
} else {
  console.log("文件不存在");
  fs.writeFile("./test.txt", "不存在就新建", (err) => {
    console.log(err ? "新建失败" : "新建成功");
  });
}
*/

// 创建和删除目录
// 编写一个 Node.js 脚本，完成以下任务：
// 创建一个名为 testDir 的目录。
// 在该目录下创建一个名为 example.txt 的文件，并写入内容 "This is a test file."。
/*
fs.mkdir("./testDir", (err) => {
  if (err) {
    console.log("目录testDir已存在");
    fs.writeFileSync("./testDir/example.txt", "This is a test file.");
  } else {
    console.log("新建目录成功");
    fs.writeFileSync("./testDir/example.txt", "This is a test file.");
  }
});
*/

// 删除该目录及其所有内容。
// 提示：使用 fs.mkdir()、fs.writeFile() 和 fs.rmdir()（fs.rmdir() 的 recursive 参数）。
/* node14废弃了rmdir()  用rm()
fs.rmdir("./testDir", { recursive: true }, (err) => {
  console.log(err ? "不存在该目录" : "删除成功");
});
*/
/*
fs.rm("./testDir", { recursive: true }, (err) => {
  console.log(err ? "目录不存在" : "删除目录成功");
});
*/

// 读取目录内容
// 编写一个 Node.js 脚本，读取指定目录下的所有文件和子目录的名称，并打印到控制台。
// 提示：使用 fs.readdir() 或 fs.readdirSync()。
/*
fs.readdir("./testDir", { withFileTypes: true }, (err, files) => {
  if (err) {
    console.log(err);
  } else {
    files.forEach((file) => {
      console.log(
        file.isDirectory() ? `目录名:${file.name}` : `文件名${file.name}` //读不到w.txt的文件名，b目录也读不到
      );
    });
  }
});
*/

// 文件内容替换
// 编写一个 Node.js 脚本，读取一个文本文件（example.txt），将文件中的所有单词 "Node.js" 替换为 "JavaScript"，然后将修改后的内容写回到原文件。
// 提示：使用 fs.readFile() 和 fs.writeFile()，结合正则表达式。
/*
fs.readFile("example.txt", "utf8", (err, content) => {
  if (err) {
    console.log(err);
  } else {
    fs.writeFile(
      "example.txt",
      content.replace(/Node\.js/g, "JavaScript"),
      (err) => {
        console.log(err ? err : "替换成功");
      }
    );
  }
});
*/

// 文件复制
// 编写一个 Node.js 脚本，将一个文件（source.txt）的内容复制到另一个文件（destination.txt）中。
// 提示：可以使用 fs.copyFile() 或手动读取和写入文件。
/*
fs.copyFile("source.txt", "destination.txt", (err) => {
  console.log(err ? err : "复制文件内容成功");
});
*/

// 文件大小统计
// 编写一个 Node.js 脚本，计算指定目录下所有文件的总大小（以字节为单位）。
// 提示：使用 fs.readdir() 和 fs.stat()。
/*
fs.readdir("./testDir", { withFileTypes: true }, (err, files) => {
  if (err) {
    console.log(err);
  } else {
    files.forEach((file) => {
      fs.stat("./testDir/" + file.name, (err, stats) => {
        if (err) {
          console.log(err);
        } else {
          console.log(file.name, stats.size);
        }
      });
    });
  }
});
*/

// 文件备份
// 编写一个 Node.js 脚本，将指定目录下的所有文件备份到另一个目录中。备份文件的命名规则为：原文件名_备份时间戳。
// 提示：使用 fs.readdir()、fs.copyFile() 和 Date.now()。
/*  不会复制目录
if (!fs.existsSync("testDir2")) {
  fs.mkdirSync("testDir2"); //不存在就新建目录
}
fs.readdir("testDir", { withFileTypes: true }, (err, files) => {
  if (err) {
    console.log("读取目录失败:", err);
  }
  //存在就直接复制文件
  files.forEach((file) => {
    fs.copyFile(
      `./testDir/${file.name}`,
      `./testDir2/${path.basename(
        file.name,
        path.extname(file.name)
      )}_${Date.now()}${path.extname(file.name)}`,
      (err) => {
        console.log(err ? err : "复制文件成功");
      }
    );
  });
});
*/

// 文件系统监控
// 编写一个 Node.js 脚本，监控指定目录的文件变化（如新增文件、删除文件、修改文件）。当检测到变化时，打印出变化的文件名和变化类型。
// 提示：使用 fs.watch() 或 fs.watchFile()。
//监控单个文件
/*
fs.watch("source.txt", (eventType, fileName) => {
  console.log(eventType, filename);
});
fs.watchFile("source.txt", (curr, prev) => {
  if (curr.mtimeMs !== prev.mtimeMs) {
    console.log(curr); //当前文件状态
    console.log(prev); //上一次文件状态
  }
});
*/
//监控目录
/*
fs.watch("./testDir", (eventType, fileName) => {
  //只监控到当前目录及子目录
  console.log(eventType, "=====", fileName);
});
fs.watchFile("./testDir", (curr, prev) => {
  if (curr.mtimeMs !== prev.mtimeMs) {
    console.log(curr); //当前目录状态
    console.log(prev); //上一次目录状态
  }
});
*/

// 文件压缩与解压
// 编写一个 Node.js 脚本，完成以下任务：
// 将指定目录下的所有文件压缩为一个 .zip 文件。
// 解压一个 .zip 文件到指定目录。
// 提示：可以使用第三方模块（如 archiver 或 unzipper）。

// 日志文件管理
// 编写一个 Node.js 脚本，实现一个简单的日志文件管理系统：
// 每天生成一个新的日志文件，文件名格式为 log_YYYYMMDD.txt。
// 将日志内容追加到当天的日志文件中。
// 提供一个命令行接口，允许用户输入日志内容。
// 提示：使用 fs.appendFile() 和 Date 对象。
